Component({
    properties: {
        // 初始位置比例（相对屏幕宽高，0-1范围，适配不同屏幕）
        initLeftRatio: {
            type: Number,
            value: 0.8 // 初始左侧距离为屏幕宽度的80%
        },
        initTopRatio: {
            type: Number,
            value: 0.5 // 初始顶部距离为屏幕高度的50%
        },
        // 图标尺寸（rpx转px计算）
        sizeRpx: {
            type: Number,
            value: 100 // 100rpx，会自动转为px
        }
    },
    data: {
        left: 0,
        top: 0,
        startX: 0,
        startY: 0,
        windowWidth: 0, // 屏幕宽度（px）
        windowHeight: 0, // 屏幕高度（px）
        tabBarHeight: 50, // TabBar高度（px，默认值，会动态获取）
        size: 50, // 实际尺寸（px）
        panelWidth: 200, // 面板宽度（px）
        // 新增：标记是否正在拖动
        isDragging: false,
        // 新增：缓存实时位置（避免频繁setData）
        tempLeft: 0,
        tempTop: 0,
        after_left: 0,
        // 聊天面板状态
        isChatOpen: false,
        messages: [
            {
                type: 'ai',
                content: '你好！我是你的牙齿健康助手，有什么关于牙齿健康的问题都可以问我哦～',
                time: '09:30'
            }
        ],
        inputValue: '',
        scrollTop: 0,
        isBtnDisabled: true, // 初始禁用
    },
    lifetimes: {
        attached() {
            this.initSystemInfo();
            this.initPosition();
            // 监听页面显示事件（关键：确保切换页面时同步位置）
            this.bindPageShow();
        }
    },
    methods: {

        // 打开聊天面板
        openChat() {
            this.setData({
                isChatOpen: true
            });

            // 确保滚动到底部
            setTimeout(() => {
                this.scrollToBottom();
            }, 300);
        },

        // 关闭聊天面板
        closeChat() {
            this.setData({
                isChatOpen: false
            });
        },

        // 输入框内容变化
        handleInput(e) {
            const value = e.detail.value;
            const isDisabled = !value.trim();
            this.setData({
                inputValue: value,
                isBtnDisabled: isDisabled // 手动同步禁用状态
            });
            console.log("手动控制：是否禁用按钮", isDisabled);
        },
        // 新增：输入框失焦时触发
        onInputBlur(e) {
            console.log("输入框失去焦点了");
            // 获取当前输入框的内容，并去除首尾空格
            const value = e.detail.value.trim();

            // 关键：无论什么原因，只要最终内容是空的，就强制同步状态
            // 这一步是为了防止一些极端情况导致的状态不一致
            if (value === '') {
                this.setData({
                    inputValue: '', // 确保数据和视图完全一致
                    isBtnDisabled:true
                });
            }
        },

        // 发送消息
        sendMessage() {
            const { inputValue, messages } = this.data;
            if (!inputValue.trim()) return;

            // 1. 新增用户消息（带唯一id）
            const userMessage = {
                id: Date.now(), // 时间戳作为唯一标识
                type: 'user',
                content: inputValue,
                time: this.formatTime(new Date())
            };
            const newMessages = [...messages, userMessage];

            // 2. 更新数据并滚动到底部
            this.setData({
                messages: newMessages,
                inputValue: ''
            }, () => {
                this.scrollToBottom(); // 确保DOM更新后再滚动
            });

            // 3. 模拟AI回复
            setTimeout(() => {
                this.getAIResponse(inputValue);
            }, 1000);
        },

        // 模拟AI回复
        getAIResponse(userInput) {
            const { messages } = this.data;
            let aiResponse = '';

            // 根据用户输入生成不同的回复
            if (userInput.includes('刷牙') || userInput.includes('清洁')) {
                aiResponse = '正确的刷牙方法是：使用巴氏刷牙法，将牙刷与牙齿呈45度角，轻柔地来回刷洗，每次刷牙至少两分钟，每天早晚各一次。记得还要清洁舌苔哦！';
            } else if (userInput.includes('美白') || userInput.includes('黄牙')) {
                aiResponse = '牙齿美白的方法有很多，包括：1. 专业洗牙；2. 美白牙膏；3. 美白贴；4. 专业美白治疗。建议先咨询牙医，根据牙齿情况选择合适的方法。';
            } else if (userInput.includes('蛀牙') || userInput.includes('龋齿')) {
                aiResponse = '蛀牙是由细菌引起的牙齿硬组织破坏。预防蛀牙的方法包括：保持良好的口腔卫生、减少糖分摄入、定期检查牙齿。如果已经出现蛀牙，应及时就医补牙。';
            } else if (userInput.includes('智齿') || userInput.includes('尽头牙')) {
                aiResponse = '智齿是否需要拔除，取决于智齿的生长位置、方向和口腔卫生状况。如果智齿反复发炎、影响邻牙或造成口腔卫生死角，建议拔除。具体情况需要牙医检查后决定。';
            } else {
                aiResponse = '感谢你的提问！关于牙齿健康，我可以为你提供刷牙方法、口腔护理、牙齿美白、蛀牙预防、智齿处理等方面的建议。你可以具体问我某个方面的问题。';
            }

            // 添加AI回复
            const aiMessage = {
                id: Date.now(),
                type: 'ai',
                content: aiResponse,
                time: this.formatTime(new Date())
            };

            this.setData({
                messages: [...messages, aiMessage]
            }, () => {
                this.scrollToBottom();
            });
        },

        // 滚动到底部（兼容Component选择器）
        scrollToBottom() {
            const query = wx.createSelectorQuery().in(this);
            query.select('.chat-content').boundingClientRect(rect => {
                if (rect) { // 防止元素未加载的情况
                    this.setData({
                        scrollTop: rect.scrollHeight // 关键：用scrollHeight获取内容总高度
                    });
                }
            }).exec();
        },

        // 格式化时间
        // 格式化时间（兼容所有基础库版本）
        formatTime(date) {
            let hours = date.getHours();
            let minutes = date.getMinutes();
            // 手动补零：小于 10 则前面加 '0'
            hours = hours < 10 ? '0' + hours : hours;
            minutes = minutes < 10 ? '0' + minutes : minutes;
            return `${hours}:${minutes}`;
        },

        // 初始化系统信息（屏幕尺寸、TabBar高度）
        initSystemInfo() {
            const res = wx.getSystemInfoSync()
            // 计算尺寸（rpx转px：1rpx = windowWidth/750）
            const size = (this.data.sizeRpx * res.windowWidth) / 750
            // 获取TabBar高度（如果是自定义TabBar，需要手动传入）
            const tabBarHeight = res.screenHeight - res.windowHeight // 原生TabBar高度计算方式

            this.setData({
                windowWidth: res.windowWidth,
                windowHeight: res.windowHeight,
                tabBarHeight,
                size,
                panelWidth: res.windowWidth * 0.6 // 面板宽度为屏幕的60%
            })
        },

        initPosition() {
            const app = getApp();
            const { windowWidth, size, windowHeight, tabBarHeight } = this.data;

            if (app.globalData.floatPosition) {
                // 从全局读取时，直接使用精确值（不取整）
                this.setData({
                    left: app.globalData.floatPosition.left,
                    top: app.globalData.floatPosition.top,
                    tempLeft: app.globalData.floatPosition.left,
                    tempTop: app.globalData.floatPosition.top
                });
            } else {
                // 初始位置计算（基于比例，不强制取整）
                const baseLeft = (this.data.initLeftRatio * windowWidth) - (size / 2);
                const baseTop = (this.data.initTopRatio * (windowHeight - tabBarHeight));

                // 初始吸附（平滑计算）
                const newLeft = baseLeft < windowWidth / 2 ? 0 : windowWidth - size;

                this.setData({
                    left: newLeft,
                    top: baseTop,
                    tempLeft: newLeft,
                    tempTop: baseTop
                });

                // 保存初始位置到全局
                app.globalData.floatPosition = { left: newLeft, top: baseTop };
                wx.setStorageSync('floatPosition', app.globalData.floatPosition);
            }
        },

        // 绑定页面的onShow事件，页面显示时同步最新位置
        bindPageShow() {
            // 获取当前页面实例
            const pages = getCurrentPages();
            const currentPage = pages[pages.length - 1];

            // 保存原始onShow方法（避免覆盖页面自身的onShow）
            const originalOnShow = currentPage.onShow;

            // 重写页面的onShow方法
            currentPage.onShow = function (...args) {
                // 先执行页面自身的onShow
                if (originalOnShow) {
                    originalOnShow.apply(this, args);
                }
                // 同步全局最新位置到当前组件
                const app = getApp();
                if (app.globalData.floatPosition) {
                    this.setData({
                        left: app.globalData.floatPosition.left,
                        top: app.globalData.floatPosition.top
                    });
                }
            }.bind(this); // 绑定组件的this，确保setData生效
        },


        // 触摸开始：使用pageX/pageY
        handleTouchStart(e) {
            // 禁用页面滚动
            wx.setPageStyle({
                style: { overflow: 'hidden' }
            });
            const { left, top } = this.data; // 正确：从this.data中解构left和top
            this.setData({
                startX: e.touches[0].pageX,  // 改为pageX（相对于页面左上角）
                startY: e.touches[0].pageY,  // 改为pageY
                showPanel: false,
                isDragging: true,  // 开始拖动，关闭过渡
                tempLeft: left, // 初始化临时位置为当前位置
                tempTop: top
            })
        },

        // 触摸移动：优化边界计算
        handleTouchMove(e) {
            // 防止未初始化的情况
            if (!this.data.isDragging) return;
            const { windowWidth, windowHeight, tabBarHeight, size, tempLeft,
                tempTop, startX, startY } = this.data;

            // 1. 计算移动距离（简化逻辑）
            const currentX = e.touches[0].pageX;
            const currentY = e.touches[0].pageY;

            // 2. 计算原始移动距离（定义rawLeft和rawTop，修复未定义错误）
            const rawLeft = tempLeft + (currentX - startX); // 关键：定义rawLeft
            const rawTop = tempTop + (currentY - startY);  // 关键：定义rawTop

            // 3. 过滤微小移动（避免手指抖动）
            const moveDistance = Math.sqrt(
                Math.pow(currentX - startX, 2) + Math.pow(currentY - startY, 2)
            );
            if (moveDistance < 2) return; // 小于2px不更新

            // 2. 边界限制（用Math.round避免小数像素导致的模糊晃动）
            const newLeft = Math.round(Math.max(0, Math.min(rawLeft, windowWidth - size)));
            const newTop = Math.round(Math.max(0, Math.min(rawTop, windowHeight - size - tabBarHeight)));


            this.setData({ left: newLeft, top: newTop });

            // 4. 实时更新临时起点（避免累积偏差）
            this.setData({
                startX: currentX,
                startY: currentY,
                tempLeft: newLeft, // 用修正后的位置作为下一次计算的基准
                tempTop: newTop
            });
        },

        // 触摸结束时，确保全局位置被正确更新（加强版）
        handleTouchEnd() {
            // 恢复页面滚动
            wx.setPageStyle({
                style: { overflow: 'auto' }
            });
            // 结束拖动，恢复过渡动画
            this.setData({ isDragging: false });

            // 吸附逻辑
            const { windowWidth, size, left, top } = this.data;
            const newLeft = left < windowWidth / 2 ? 0 : windowWidth - size;
            this.setData({ left: newLeft });

            // 强制更新全局位置（确保所有界面能读到最新值）
            const app = getApp();
            app.globalData.floatPosition = {
                left: newLeft,
                top: top
            };
            // 同时更新本地存储（可选，确保重启后生效）
            wx.setStorageSync('floatPosition', app.globalData.floatPosition);
        }
    },

    // 面板按钮点击事件（传递给父页面处理）
    handlePanelAction(e) {
        const { action } = e.currentTarget.dataset
        // 关闭面板
        if (action === 'close') {
            this.setData({ showPanel: false })
        } else {
            // 向父页面触发事件
            this.triggerEvent('action', { action })
            this.setData({ showPanel: false })
        }
    }
})
